#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
    pid_t id = fork();  //fork是一个函数，他会创建一个子进程，当我们创建出一个子进程的时候，我们
                        //的父进程的代码和子进程就是共用的，这时候他们就会使用同一份代码，
                        //我们的fork函数的返回return的时候也就会返回两次，
    if(id == 0)
    {
        //子进程
        //当fork创建子进程的时候，会给我们的父进程返回子进程的id值，
        //会给子进程返回0；      因为我们的父进程可以有很多个子进程，所以给父进程返回子进程的id
        int cnt = 5;
        while(cnt)
        {
            printf(",pid:%d,ppid,%d\n",getpid(),getppid());
            //getpid而已获得当前进程的pid，getppid可以获得父进程的pid
            cnt--;
            sleep(1);
            //我们设置循环5次，然后每次我们打印一下我们当前进程的pid，然后再打印一下父进程pid，
            //然后我们设置沉睡一秒。
        }
        exit(0);
        //当我们把子进程的代码执行完后，我们让他主动的exit退出，
    }
    else if(id > 0)
    {
        //当我们的id值大于0的时候，这个时候就是我们的父进程，
        //这里可能就会有一个问题，那就是我们的代码怎么会既执行if了，然后又执行else if
        //其实这个问题我们刚才就说了，因为我们的fork是一个函数，我们的子进程被创建以后
        //我们的父进程的代码就是和子进程一起共用的了，那么fork函数内部创建的子进程，
        //道fork return结束之前肯定是已经创建好了的，所以我们的return代码也会是共用的
        //所以我们的id就又两个，其实学习到后面我们就会直到。
        //我们的子进程同样是创建了一个pcb，和我们的父进程一样的pcb还有虚拟函数地址，还有页表，
        //当然，我们还说过，我们的进程具有独立性，父子进程当然也绝不例外，，
        //你的父母不是你的前传，你的孩子也绝不能是你的续写，
        //我们的父子进程也是需要保持独立的，当我们的父子进程都是只对我们的代码和数据进行读的时候
        //我们都是相安无事的，但是如果子进程想要对我们的代码和数据进行修改的时候，这时候我们就需要
        //发生写时拷贝了，给我们的子进程拷贝一份代码和数据，但是子进程的pcb和虚拟的地址，页表，都是不需要拷贝的
        //因为这些东西在我们创建子进程的时候就已经开辟好了。
            
    
    }



    return 0;
}





//int main()
//{
// pid_t id =fork();
// if(id==0)
// {
////子进程
//
//
//
//
// return 0;
//}
//











